<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8">
<meta name="viewport"
      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">

    <meta name="author" content="xxx">




    <meta name="keywords" content="博客">




<title>redis | 小站</title>



    <link rel="icon" href="/favicon.ico">



<style>
    @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&family=Roboto+Mono&display=swap');
</style>



    <!-- stylesheets list from _config.yml -->
    
    <link rel="stylesheet" href="/css/style.css">
    




    <!-- scripts list from _config.yml -->
    
    <script src="/js/frame.js"></script>
    







    <script src='https://unpkg.com/valine@1.4.16/dist/Valine.min.js'></script>




  <meta name="generator" content="Hexo 6.0.0"></head>
  <body>
    <div class="mask-border">
    </div>

    <div class="wrapper">

      <div class="header">
  <div class="flex-container">
    <div class="header-inner">
      <div class="site-brand-container">
        <a href="/">
          
            Wudiguang.
          
        </a>
      </div>
      <div id="menu-btn" class="menu-btn" onclick="toggleMenu()">
        Menu
      </div>
      <nav class="site-nav">
        <ul class="menu-list">
          
            
              <li class="menu-item">
                <a href="/">Home</a>
              </li> 
                   
          
            
              <li class="menu-item">
                <a href="/tag/">标签</a>
              </li> 
                   
          
            
              <li class="menu-item">
                <a href="/archives/">时间线</a>
              </li> 
                   
          
            
              <li class="menu-item">
                <a href="/categories/gallery/">展览馆</a>
              </li> 
                   
          
            
              <li class="menu-item">
                <a href="/comment/">留言</a>
              </li> 
                   
          
        </ul>
      </nav>
    </div>
  </div>
</div>


      <div class="main">
        <div class="flex-container">
          <article id="post">

  
    <div class="post-head">
    <div class="post-info">
        <div class="tag-list">
            
                
                    <span class="post-tag">
                        <a href="/tags/%E5%88%86%E5%B8%83%E5%BC%8F/">
                            分布式
                        </a>
                    </span>    
                
                    <span class="post-tag">
                        <a href="/tags/redis/">
                            redis
                        </a>
                    </span>    
                           
            
        </div>
        <div class="post-title">
            
            
                redis
            
            
        </div>
        <span class="post-date">
            8月 3, 2021
        </span>
    </div>
    <div class="post-img">
        
            <div class="h-line-primary"></div>
              
    </div>
</div>
    <div class="post-content">
    <h2 id="一、redis-概述-amp-redis-特点"><a href="#一、redis-概述-amp-redis-特点" class="headerlink" title="一、redis 概述 &amp; redis 特点"></a>一、redis 概述 &amp; redis 特点</h2><blockquote>
<p>Redis（Remote Dictionary Server）远程数据服务，是一种支持 key-value 等多种数据结构的存储系统。可用于缓存，事件发布或订阅，高速队列等场景。支持网络，提供 string，hash，list，set，zset 等数据结构，基于内存，可持久化</p>
</blockquote>
<ul>
<li>丰富的数据类型：适用场景多</li>
<li>内存存储：快</li>
<li>持久化：数据安全</li>
</ul>
<h2 id="二、数据结构"><a href="#二、数据结构" class="headerlink" title="二、数据结构"></a>二、数据结构</h2><blockquote>
<p>redis 是 key-value 数据库，key 只能是 string，value 可以是 string、hash、list、set、 sorted set</p>
</blockquote>
<ul>
<li>string：最大存储 512m（set key_name value），信息缓存、计数器、分布式锁</li>
<li>hash：适合存储对象，key-value 集合(hset key_name field value)，购物车（用户id为key，商品id为field，商品数量为value）</li>
<li>list：字符串列表，有序可重复（lpush key_name value1.. value10），是一个分页做定时排行榜</li>
<li>set：字符串无序不可重复集合（sadd key_name value…），收藏夹</li>
<li>sorted set：有序集合（zadd key_name score value），实时排行榜</li>
</ul>
<span id="more"></span>

<h2 id="三、redis-持久化策略"><a href="#三、redis-持久化策略" class="headerlink" title="三、redis 持久化策略"></a>三、redis 持久化策略</h2><blockquote>
<p>将内存中数据存储到磁盘中</p>
</blockquote>
<ul>
<li>RDB：快照存储</li>
<li>AOF：记录写操作，追加到日志文件中，服务器重启时重新执行这些命令</li>
<li>不使用持久化</li>
<li>RDB&amp;AOF：同时开启两种持久化，redis重启时优先载入 AOP 文件来恢复原始数据，AOF中数据比RDB更加完整</li>
</ul>
<h2 id="四、redis-线程模型"><a href="#四、redis-线程模型" class="headerlink" title="四、redis 线程模型"></a>四、redis 线程模型</h2><p>redis 内部使用文件处理器，单线程架构。采用 IO 多路复用机制同时监听多个 socket，根据 socket 上的事件选择对应的事件处理器进行处理<br>单线程高效率：</p>
<ul>
<li>纯内存操作</li>
<li>核心是基于非阻塞的 IO 多路复用机制</li>
<li>单线程避免了多线程上下文切换</li>
</ul>
<h2 id="五、常见问题"><a href="#五、常见问题" class="headerlink" title="五、常见问题"></a>五、常见问题</h2><ul>
<li>雪崩：缓存中大批量 key 过期，请求直接落到数据库。使 key 过期时间均匀，加互斥锁，用不过期</li>
<li>穿透：恶意请求系统中不存在的数据。使用布隆过滤器（爬虫系统url去重、垃圾邮件过滤、黑名单），返回空对象</li>
<li>预热：系统上线后将缓存数据直接加载到缓存系统，避免用户请求直接落到数据库再写到缓存。工程启动时进行加载缓存动作，设置一个定时任务脚本，先保证热点数据提前加载到缓存</li>
<li>击穿：某热点 key 失效瞬间，请求直接落到数据库。增加回血缓存互斥锁，热点 key 永不过期</li>
<li>降级：指缓存失效或者服务器挂掉，不直接访问数据库，直接返回默认值或者访问服务的内存数据，避免数据库遭受巨大压力</li>
</ul>
<h2 id="六、内存淘汰机制"><a href="#六、内存淘汰机制" class="headerlink" title="六、内存淘汰机制"></a>六、内存淘汰机制</h2><blockquote>
<p>redis 缓存不足时，通过淘汰旧数据来处理新加入数据的策略</p>
</blockquote>
<ul>
<li>noeviction：默认策略，对于写请求直接返回错误</li>
<li>allkeys-lru：所有 key 最近最少使用</li>
<li>volatile-rlu：设置了过期时间的 key 最近最少使用</li>
<li>allkeys-random：所有 key 中随机淘汰</li>
<li>volatile-random：从设置了过期时间的 key 中随机淘汰</li>
<li>volatile-ttl：在设计了过期时间的 key 中根据过期时间淘汰最早过期的 key</li>
<li>allkeys-lfu：所有的 key 中，最少使用频率，4.0开始支持</li>
<li>volatile-lfu：设置了过期时间的 key 中，最少使用频率，4.0开始支持</li>
</ul>
<h2 id="七、redis事务机制"><a href="#七、redis事务机制" class="headerlink" title="七、redis事务机制"></a>七、redis事务机制</h2><blockquote>
<p>MULTI 开启，操作命令加入队列，EXEC 命令开始顺序执行。如果执行报错，不会回滚</p>
</blockquote>
<ul>
<li>WATCH：为 redis 提供 check-and-set（CAS）行为。被 WATCH 的 key 如果被改动，则 EXEC 时会返回 nil-reply</li>
<li>MULTI：开启一个事务</li>
<li>UNWATCH：取消 WATCH 命令所有的 key</li>
<li>DISCARD：放弃事务，事务列表被清空，并退出事务状态</li>
<li>EXEC：负责执行事务中所有命令</li>
</ul>
<h2 id="八、redis-主从复制"><a href="#八、redis-主从复制" class="headerlink" title="八、redis 主从复制"></a>八、redis 主从复制</h2><blockquote>
<p>指将一台 redis 服务器数据复制到其他 redis 服务器。前者为主节点（master），后者为从节点（slave）。数据的复制是单向的，只能由主到从</p>
</blockquote>
<p>主从复制作用：</p>
<ul>
<li>数据荣誉：热数据备份</li>
<li>故障恢复：主节点故障，可以由从节点提供服务</li>
<li>负载均衡：读写分离，主节点负责写数据，从节点负责读数据</li>
<li>高可用：是哨兵和集群的基础</li>
</ul>
<p>实现原理：</p>
<blockquote>
<p>三个阶段：连接建立阶段、数据同步阶段、命令传播阶段</p>
</blockquote>
<h2 id="九、哨兵（Sentinel）原理"><a href="#九、哨兵（Sentinel）原理" class="headerlink" title="九、哨兵（Sentinel）原理"></a>九、哨兵（Sentinel）原理</h2><blockquote>
<p>是 redis 高可用的实现方案，管理多个 redis 实例，实现对 redis 的监控、通知、自动故障转移</p>
</blockquote>
<p>问题引入：redis 主从负责模式下，一旦主节点故障无法提供服务，需要手动将从节点晋升为主节点，还需要通知客户端更新主节点地址，这个故障处理方案是不可取的</p>
<h2 id="十、-memcache-amp-redis-区别"><a href="#十、-memcache-amp-redis-区别" class="headerlink" title="十、 memcache &amp; redis 区别"></a>十、 memcache &amp; redis 区别</h2><ul>
<li>memcache 纯内存，数据量不能超过内存，redis 支持持久化</li>
<li>memcache 只支持 string，redis 支持多种</li>
</ul>
<h2 id="十一、客户端"><a href="#十一、客户端" class="headerlink" title="十一、客户端"></a>十一、客户端</h2><ul>
<li>Jedis</li>
<li>Redisson</li>
<li>Lettuce</li>
</ul>

</div> 

<script>
    window.onload = detectors();
</script>
    <div class="post-footer">
    <div class="h-line-primary"></div>
    <nav class="post-nav">
        <div class="prev-item">
           
                <div class="icon arrow-left"></div>
                <div class="post-link">
                    <a href="/2021/08/05/zookeeper/">Prev</a>
                </div>
            
        </div>
        <div class="next-item">
            
        </div>
    </nav>
</div>

    
      <div class="post-comment">

    
        <div id="vcomments"></div>
        <script>
            var META = ['nick', 'mail', 'link'];
            var meta = 'nick,mail';
            meta = meta.split(',').filter(item => {
                return META.includes(item);
            });
            new Valine({
                el: '#vcomments',
                appId: 'X7Jbrh9MUCMJpzODTOJJImgc-gzGzoHsz',
                appKey: 'ALE0H1nS33YlJtDpquuDHFPz',
                lang: 'en',
                placeholder: 'Say something',
                avatar: 'mp',
                meta: meta
            })
        </script>    
     

     
    
    

</div>
     
  
</article>
        </div>
      </div>
      
      <div class="footer">
    <div class="flex-container">
        <div class="footer-text">
            
            
            
                Powered by <a target="_blank" rel="noopener" href="https://hexo.io/">Hexo</a> & <a target="_blank" rel="noopener" href="https://github.com/zoeingwingkei/frame/">Frame</a>
                
        </div>
    </div>
</div>

    </div>

  </body>
</html>
